package com.jinzhi.jzweb.utils;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import com.jinzhi.jzapi.utils.ExcelStyleUtil;
import com.jinzhi.jzapi.utils.HttpClientUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;

public class EasyPoiUtil {

    private static ExcelStyleUtil excelStyleUtil;
    /**
     * 功能描述：复杂导出Excel，包括文件名以及表名。创建表头
     *
     * @param list           导出的实体类
     * @param title          表头名称
     * @param sheetName      sheet表名
     * @param pojoClass      映射的实体类
     * @param isCreateHeader 是否创建表头
     * @param fileName
     * @param response
     * @return
     * @author FK
     * @date 2018/7/23 13:07
     */
    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) {
        ExportParams exportParams = new ExportParams(title, sheetName);
        exportParams.setCreateHeadRows(isCreateHeader);
        defaultExport(list, pojoClass, fileName, response, exportParams);
    }


    /**
     * 功能描述：复杂导出Excel，包括文件名以及表名,不创建表头
     *
     * @param list      导出的实体类
     * @param title     表头名称
     * @param sheetName sheet表名
     * @param pojoClass 映射的实体类
     * @param fileName
     * @param response
     * @return
     * @author FK
     * @date 2018/7/23 13:07
     */
    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) {
        defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
    }

    /**
     * 功能描述：Map 集合导出
     *
     * @param list     实体集合
     * @param fileName 导出的文件名称
     * @param response
     * @return
     * @author FK
     * @date 2018/7/23 16:14
     */
    public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
        defaultExport(list, fileName, response);
    }

    /**
     * 功能描述：默认导出方法
     *
     * @param list         导出的实体集合
     * @param fileName     导出的文件名
     * @param pojoClass    pojo实体
     * @param exportParams ExportParams封装实体
     * @param response
     * @return
     * @author FK
     * @date 2018/7/23 15:33
     */
    private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {
        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
        if (workbook != null) {
            downLoadExcel(fileName, response, workbook);
        }
    }

    /**
     * 功能描述：Excel导出
     *
     * @param fileName 文件名称
     * @param response
     * @param workbook Excel对象
     * @return
     * @author FK
     * @date 2018/7/23 15:35
     */
    private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xls");
            workbook.write(response.getOutputStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 功能描述：默认导出方法
     *
     * @param list     导出的实体集合
     * @param fileName 导出的文件名
     * @param response
     * @return
     * @author FK
     * @date 2018/7/23 15:33
     */
    private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
        Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
        if (workbook != null)
            downLoadExcel(fileName, response, workbook);
    }


    /**
     * 功能描述：根据文件路径来导入Excel
     *
     * @param filePath   文件路径
     * @param titleRows  表标题的行数
     * @param headerRows 表头行数
     * @param pojoClass  Excel实体类
     * @return
     * @author FK
     * @date 2018/7/23 14:17
     */
    public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) {
        //判断文件是否存在
        if (StringUtils.isBlank(filePath)) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        List<T> list = null;
        try {
            list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
        } catch (NoSuchElementException e) {
            throw new RuntimeException("模板不能为空");
        } catch (Exception e) {
            e.printStackTrace();

        }
        return list;
    }

    /**
     * 功能描述：根据接收的Excel文件来导入Excel,并封装成实体类
     *
     * @param file       上传的文件
     * @param titleRows  表标题的行数
     * @param headerRows 表头行数
     * @param pojoClass  Excel实体类
     * @return
     * @author FK
     * @date 2018/7/23 14:17
     */
    public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass) {
        if (file == null) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        List<T> list = null;
        try {
            list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
            file.getInputStream().close();
        } catch (NoSuchElementException e) {
            throw new RuntimeException("excel文件不能为空");
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
        return list;
    }

    public static HSSFWorkbook createWorkBook(List<String> headList,List<Map<String,Object>> rowList,String title){
        HSSFWorkbook workbook = new HSSFWorkbook();
        //设置sheet名称
        HSSFSheet sheet = workbook.createSheet(title);
        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
        //创建第一行表头
        HSSFRow row = sheet.createRow(0);


        for(int i=0;i<headList.size();i++){
            HSSFCell cell = row.createCell(i);
            HSSFRichTextString text = new HSSFRichTextString(String.valueOf(headList.get(i)));
            cell.setCellValue(text);
        }

        int rowNum = 1;
        for(Map<String,Object> map : rowList){
            HSSFRow rowl = sheet.createRow(rowNum);
            rowl.setHeightInPoints(100);
            for(int i=0;i<headList.size();i++){
                HSSFCell cell = rowl.createCell(i);
				if(EfficacyUtil.isPhoto(String.valueOf(map.get(headList.get(i))))){
					//byte[] img = HttpClientUtil.getImageFromNetByUrl();
                    CellStyle cellStyle = workbook.createCellStyle();
                    sheet.setColumnWidth(i,20*256);
                    ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
                    try {
                        //System.out.println(String.valueOf(map.get(headList.get(i))));
                        BufferedImage bufferImg = ImageIO.read(HttpClientUtil.getImageInputStreamFromNetByUrl(String.valueOf(map.get(headList.get(i)))));
                        ImageIO.write(bufferImg,"png",byteArrayOut);
                        HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0,(short)i, rowNum, (short) (i+1), rowNum+1);
                        patriarch.createPicture(anchor, workbook.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }else{
                    cell.setCellValue(String.valueOf(map.get(headList.get(i))));
                }
            }
            rowNum++;
        }
        return workbook;
    }

    public static void downLoadExcel(String fileName, HttpServletResponse response, HttpServletRequest request, Workbook workbook) throws IOException {
        ServletOutputStream outputStream = null;
        Log log = null;
        try {

            try {
                // 设置文件名的编码格式
                fileName = new String(fileName.getBytes(), "ISO8859-1");
            } catch (UnsupportedEncodingException e) {
                log.info("导出失败 --0");
            }
            // 设置文件的编码格式
            response.setContentType("application/octet-stream;charset=ISO8859-1");
            // 设置响应头添加附件
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            // 设置不需要缓存
            response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");

            response.addHeader("fileName",fileName);

            outputStream = response.getOutputStream();
            workbook.write(outputStream);
            outputStream.flush();
        } catch (IOException e) {
            log.error("导出excel时出错：{}", e);
        } finally {
            workbook.close();
            if (outputStream != null) {
                outputStream.flush();
                outputStream.close();
            }
        }
    }
}
